#include "Log.hpp"
#include "httpServer.hpp"
#include "NetIO.hpp"
#include "Util.hpp"
#include <memory>
#include <string>
#include <vector>
#include <fstream>

#define ROOT "./wwwroot"

void Usage(const char *proc)
{
    std::cout << "\nHttpServer# " << proc << " HttpServerPort\n"
              << std::endl;
}

// 对网页请求进行响应的函数
void HandlerHttpRequest(int sock)
{
    std::string recv_request; // 读到的信息
    bool ret = ns_netio::Recv(sock, recv_request);
    if (ret)
    {
        std::vector<std::string> vline; // 逐行获取客户端请求
        Util::cutString(recv_request, "\r\n", &vline);

        // Debug -- 检验行切割是否成功
        // for (const auto &str : vline)
        // {
        //     std::cout << "***********" << str << "***********" << std::endl;
        // }

        // 切分第一行，获取请求的地址
        std::vector<std::string> vblock; // 第一行各个模块
        Util::cutString(vline[0], " ", &vblock);

        // Debug -- 检验第一行切分是否成功
        // for (const auto& str : vblock)
        // {
        //     std::cout << "----------" << str << std::endl;
        // }

        std::string target = ROOT;   // web根目录
        std::string file = vblock[1];
        if(file == "/") file = "/index.html";

        target += file;    // 打开的目标资源路径
        printf("target: ### %s", target.c_str());

        std::ifstream in;   // 文件输出类
        in.open(target.c_str());    // 打开文件

        std::string content;  // 文件内容

        if(in.is_open())  // 判断文件是否打开成功
        {
            std::string line;  // 文件行
            // 将请求文件的内容读取content
            while(std::getline(in, line))
            {
                content += line;
            }
        }
        // printf("content: ### %s", content.c_str());

        if(content.empty()) 
        {
            ns_netio::Send(sock, "HTTP/1.1 404 NOT FOUND\r\n");
        }
        else
        {
            std::string msg = "HTTP/1.1 202 ok\r\n";
            msg += "\r\n";
            msg += content;
            ns_netio::Send(sock, msg);
        }
    }
}

int main(int argc, const char **argv)
{
    if (argc != 2)
    {
        Usage(argv[0]);
        exit(1);
    }

    std::unique_ptr<HttpServer> ptr_srv(new HttpServer(HandlerHttpRequest, atoi(argv[1])));

    ptr_srv->init();
    ptr_srv->start();

    return 0;
}